package com.example.musicserver.service;

import com.example.musicserver.constant.Constants;
import com.example.musicserver.mapper.MusicMapper;
import com.example.musicserver.model.Music;
import com.example.musicserver.model.User;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Hua YY
 * Date: 2025-01-19
 * Time: 20:52
 */
@Service
@Slf4j
public class MusicService {
    @Value("${music.local.path}")
    private String SAVE_PATH ;//使用反斜杠，用英文路径，部署在Linux上，避免不能识别
    @Autowired
    private MusicMapper musicMapper;



    /**
     * @param fileNameAndType 文件全名称
     * @param httpSession     http会话
     * @param singer
     */
    public Integer uploadDatebase(String fileNameAndType, HttpSession httpSession, String singer) {

        //上传前线判断数据库中是否已经存在相同的音乐了
        int index = fileNameAndType.lastIndexOf(".");
        String title = fileNameAndType.substring(0, index);
        Music music = musicMapper.selectMusicByTitle(title,singer);
        if(music != null){//查询到了一条相同名字音乐sql数据
            return -1;//若存在返回-1
        }

        User userinfo = (User) httpSession.getAttribute(Constants.USERINFO_SESSION_KEY);
        int userid = userinfo.getId();
        //前端请求播放音乐的时候，请求的路径
        String url = "/music/getMusic?path="+title;

        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm");//格式化日期类
        String time = sf.format(new Date());

        return musicMapper.insertMusic(title, singer,time,url,userid);
    }

    public Boolean uploadServer(MultipartFile file, String path) {
        File dest = new File(path);//用这个存储路径new 一个file ， dest现在就相当于 前端传进来的file可以这么理解
        if(!dest.exists()){//假设这个存储路径下有这个文件，去找它
            dest.mkdirs();//找不到就考虑创建目录，尝试创建目录部分，也就是 D:\music 目录，而不会直接创建文件 song.mp3。如果文件不存在，它不会自动创建文件，mkdirs() 仅保证目录的创建。
        }
        try {
            file.transferTo(dest);//上传文件
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     *
     * @param iid
     * @param music MusicController中已经在数据库中查到music的信息，并把music作为参数传过来了
     * @return
     */
    public int deleteMusic(int iid , Music music) {
        //1：删除数据库中的音乐
        int result = musicMapper.deleteMusicById(iid);
        if(result != 1){
            return -1;
        }
        //2：数据库中删除成功，那么服务器中的数据也要进行删除
        int index = music.getUrl().lastIndexOf("=");
        String fileName = music.getUrl().substring(index+1);//获取该音乐名称，不包含.mp3
        File file = new File(SAVE_PATH + "/" + fileName + ".mp3");
        log.info("此时的路径为：{}",file.getPath());
        //删除数据库中的音乐信息
        if(!file.delete()){
            return -2;
        }
        return 1;
    }

    /**
     * 根据id找歌曲
     * @param iid
     * @return
     */

    public Music findMusicById(int iid) {
        return musicMapper.findMusicById(iid);
    }

    public List<Music> findAllMusic() {
        return musicMapper.findAllMusic();
    }

    public List<Music> findMusic(String musicName) {
        return musicMapper.findMusicByMusicName(musicName);
    }
}
